//
//  HMUserAccountViewModel.swift
//  Weibo12
//
//  Created by HM on 15/12/29.
//  Copyright © 2015年 itheima. All rights reserved.
//  视图模型--> 保留模型属性

import UIKit

class HMUserAccountViewModel: NSObject {

    // 用户信息模型
    var userAccount: HMUserAccount?
    
    /// 单例方法
    static let sharedViewModel: HMUserAccountViewModel = HMUserAccountViewModel()
    
    override init() {
        super.init()
        // 解档给 userAccount 赋值
        userAccount = self.getUserAccount()
    }
    
    // 用户是否登录
    var userLogin: Bool {
        // 判断 accessToken 是否为空 && 没有过期？？
        if accessToken != nil && isExpiresIn == false {
            // 返回 true 代表当前是登录状态
            return true
        }
        return false
    }
    
    // 当前用户的 accessToken
    // 以后请求接口都需要用到 accessToken，所以抽取一个 getOnly 属性
    var accessToken: String? {
        return userAccount?.access_token
    }
    
    // 判断账户是否过期
    // isExpiresIn 是否过期，如果是true代表过期，false 代表不过期
    var isExpiresIn: Bool {
        
        // 1. 必须知道当前账户的 accessToken 的过期时间 
        
        if let expiresDate = userAccount?.expiresDate {
            
            // 2. 拿着第1步求出的过期时间与当前时间进行对比
            let nowDate = NSDate()
            
            //======= 以下是测试代码 =======//
            // expiresDate = nowDate.dateByAddingTimeInterval(-1)
            //======= 以上是测试代码 =======//
            print(expiresDate)
            // 3. 如果当前时间比过期时间小 --> 就代表没有过期
            if nowDate.compare(expiresDate) == .OrderedAscending {
                // 没有过期，返回false
                return false
            }
        }
        return true
    }
    
    /// 归档路径
    private var archivePath = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first! as NSString).stringByAppendingPathComponent("useraccount.archive")
    
    /// 获取AccessToken
    ///
    /// - parameter code: 授权码
    func loadAccessToken(code: String, compeleted: (isSuccess: Bool)->()){
        

        HMNetworkTools.sharedTools.loadAccessToken(code) { (response, error) -> () in
            // 请求授权码
            if error != nil {
                // 错误信息可以不提示用户，但是程序员得看
                print(error);
                compeleted(isSuccess: false)
                return
            }
            // 判断返回值是否是字典
            guard let dict = response as? [String: AnyObject] else {
                print("返回的数据不是字典")
                compeleted(isSuccess: false)
                return
            }
            // 字典转成模型
            let account = HMUserAccount(dict: dict)
            print(account)
            // 加载用户的个人信息
            self.loadUserAccount(account,compeleted: compeleted)
            
        }
        
        // 以下代码已抽取到 HMNetworkTools 里面 （抽取 url 地址与 参数）
//        // 请求地址
//        let urlString = "https://api.weibo.com/oauth2/access_token"
//        // 请求参数
//        let params = [
//            "client_id": WB_APPKEY,
//            "client_secret": WB_SECRET,
//            "grant_type": "authorization_code",
//            "code": code,
//            "redirect_uri": WB_REGIRECTURI
//        ]
//        
//        // 发送请求
//        HMNetworkTools.sharedTools.request(.POST, urlString: urlString, parameters: params) { (response, error) -> () in
//            if error != nil {
//                // 错误信息可以不提示用户，但是程序员得看
//                print(error);
//                compeleted(isSuccess: false)
//                return
//            }
//            // 判断返回值是否是字典
//            guard let dict = response as? [String: AnyObject] else {
//                print("返回的数据不是字典")
//                compeleted(isSuccess: false)
//                return
//            }
//            // 字典转成模型
//            let account = HMUserAccount(dict: dict)
//            print(account)
//            // 加载用户的个人信息
//            self.loadUserAccount(account,compeleted: compeleted)
//        }
    }
    
    
    // 获取用户的个人信息
    func loadUserAccount(account: HMUserAccount,compeleted: (isSuccess: Bool)->()){
        
        
        HMNetworkTools.sharedTools.loadUserAccount(account.access_token!, uid: account.uid!) { (response, error) -> () in
            if error != nil {
                print(error)
                compeleted(isSuccess: false)
                return
            }
            
            // 取到用户的头像与昵称，给模型赋值
            guard let dict = response as? [String: AnyObject] else {
                compeleted(isSuccess: false)
                return
            }
            
            // 设置头像
            account.avatar_large = dict["avatar_large"] as? String
            account.screen_name = dict["screen_name"] as? String
            
            print(account)
            // 到在这一步，就代表登录完成，用户信息全部获取完成
            self.userAccount = account
            // 保存登录完成的信息
            self.saveAccount(account)
            // 切换控制器
            compeleted(isSuccess: true)
        }
        
        // 以下代码已抽取到 HMNetworkTools 里面 （抽取 url 地址与 参数）
//        // 请求地址
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        // 请参数
//        let params = [
//            "access_token": account.access_token!,
//            "uid": account.uid!
//        ]
//        
//        // 请求个人信息
//        HMNetworkTools.sharedTools.request(urlString: urlString, parameters: params) { (response, error) -> () in
//            if error != nil {
//                print(error)
//                compeleted(isSuccess: false)
//                return
//            }
//            
//            // 取到用户的头像与昵称，给模型赋值
//            guard let dict = response as? [String: AnyObject] else {
//                compeleted(isSuccess: false)
//                return
//            }
//            
//            // 设置头像
//            account.avatar_large = dict["avatar_large"] as? String
//            account.screen_name = dict["screen_name"] as? String
//            
//            print(account)
//            // 到在这一步，就代表登录完成，用户信息全部获取完成
//            self.userAccount = account
//            // 保存登录完成的信息
//            self.saveAccount(account)
//            // 切换控制器
//            compeleted(isSuccess: true)
//        }
    }
}

// 怎么判断当前已经是登录状态：判断是否有用户信息并且里面是否有 accessToken 并且 accessToken 没有过期

extension HMUserAccountViewModel {
    
    /// 保存用户的信息
    ///
    /// - parameter account: <#account description#>
    func saveAccount(account: HMUserAccount) {
        // 获取到要保存的路径
        // 抽取到上面
        // let file = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first! as NSString).stringByAppendingPathComponent("useraccount.archive")
        print(archivePath)
        // 归档
        NSKeyedArchiver.archiveRootObject(account, toFile: archivePath)
        
    }
    
    /// 从文件里面解档对象
    ///
    /// - returns: <#return value description#>
    func getUserAccount() -> HMUserAccount? {
        return NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as? HMUserAccount
    }
    
}
